package gestorvideoclub.jdbc;
import gestorvideoclub.Videojuego;
import gestorvideoclub.enumeraciones.GeneroPeliculaEnum;
import gestorvideoclub.enumeraciones.GeneroVideojuegoEnum;
import gestorvideoclub.enumeraciones.ProductoEnum;
import gestorvideoclub.enumeraciones.TipoProductoEnum;
import java.sql.*;
import java.util.ArrayList;
import java.util.List;

public class VideojuegoJDBC {
   /**
     * Obtiene el videojuego de la BBDD pasandole como parametro su codigo.
     * para ello tendra que comprobar primero si existe un videojuego con ese codigo.
     * 
     * @param codigo código del videojuego a devolver
     *
     */
    public static Videojuego obtenerVideojuegoPorId(int codigo) throws NullPointerException{
        Videojuego video = new Videojuego();
        int prueba = ProductoJDBC.compruebaCodigo(codigo);
        if(prueba>0)
        {
            String sql = "select * from productos,ubicaciones, franquicia, tarifas, proveedores where productos.codigo = "+codigo+" AND productos.id_ubicacion = ubicaciones.Id AND productos.id_tarifa = tarifas.Id AND productos.id_franquicia = franquicia.Id AND productos.id_proveedor = proveedores.Id AND productos.tipoProducto='"+TipoProductoEnum.Videojuego+"'";
            Connection con = null;
            try {
                con = AccesoDatos.getConexion();
                Statement st = con.createStatement();
                ResultSet rs = st.executeQuery(sql);
                while (rs.next()) {
                    //atributos de superclase
                    video.setId(rs.getInt("productos.Id"));
                    video.setCodigo(rs.getInt("productos.codigo"));
                    video.setTitulo(rs.getString("titulo"));
                    ProductoEnum estado = ProductoEnum.valueOf(rs.getString("productos.estadoProducto"));
                    video.setEstado(estado);

                    //guardamos tarifa asociada
                    video.setTarifa(ProductoJDBC.devuelveTarifa(rs.getInt("codigo")));

                    //guardamos objeto ubicacion
                    video.setUbicacion(ProductoJDBC.devuelveUbicacion(rs.getInt("codigo")));

                    //guardamos proveedor asociado
                    video.setProveedor(ProductoJDBC.devuelveProveedor(rs.getInt("codigo")));

                    //guardamos Franquicia asociada
                    video.setFranquicia(ProductoJDBC.devuelveFranquicia(rs.getInt("codigo")));

                    //recogemos atributos propios de videojuego
                    GeneroVideojuegoEnum genero = GeneroVideojuegoEnum.valueOf(rs.getString("productos.genero"));
                    video.setGenero(genero);
                    video.setCodigo(rs.getInt("productos.codigo"));
                    TipoProductoEnum tipoP = TipoProductoEnum.valueOf(rs.getString("productos.tipoProducto"));
                    video.setTipo(tipoP);
                    video.setEdadRecomendada(rs.getInt("productos.edadRecomendada"));
                    video.setDescripcion(rs.getString("descripcion"));
                    video.setPrecioCompraProducto(rs.getDouble("precioCompra"));
                    video.setNumJugadores(rs.getInt("productos.numJugadores"));
                    video.setPlataforma(rs.getString("productos.plataforma"));
                }
            } catch (Exception e) {
                System.out.println("Error a obtener el videojuego " + e.getMessage());
            }
            AccesoDatos.cerrarConexion(con);
        }
        return video;
    }
    
    /**
     *Obtiene un array de TODOS los videojuegos existentes en la BBDD
     */
    public static ArrayList<Videojuego> consultaVideojuegos()throws NullPointerException {
        String sql = "select * from productos,ubicaciones, franquicia, tarifas, proveedores where productos.id_ubicacion = ubicaciones.Id AND productos.id_tarifa = tarifas.Id AND productos.id_franquicia = franquicia.Id AND productos.id_proveedor = proveedores.Id AND(productos.tipoProducto='" + TipoProductoEnum.Videojuego+"')";
        Connection con = null;
        ArrayList<Videojuego> listaVideojuego = new ArrayList<Videojuego>();
        try {
            con = AccesoDatos.getConexion();
            Statement st = con.createStatement();
            ResultSet rs = st.executeQuery(sql);
            while (rs.next()) {
                Videojuego video = new Videojuego();
                video = obtenerVideojuegoPorId(rs.getInt("productos.codigo")); 
                //a�adimos videojuego a la lista
                listaVideojuego.add(video);
            }

        } catch (Exception e) {
            System.out.println("Error a obtener el videojuego " + e.getMessage());
        }
        AccesoDatos.cerrarConexion(con);
        return listaVideojuego;
    }
    
    /**
     * Utilizaremos este metodo para dar de baja un videojuego.
     * 
     * @param p     videojuego que daremos de baja 
     */
    public static void modificaEstado(Videojuego v) {
        String sql = "update productos set estadoProducto='" + v.getEstado()+"' where productos.codigo=" + v.getCodigo();
        Connection con = null;
        Statement st = null;
        try {
            con = AccesoDatos.getConexion();
            st = con.createStatement();
            st.executeUpdate(sql);
            st.close();
            AccesoDatos.cerrarConexion(con);
        } catch (Exception e) {
            System.out.println("Error al modificar estado Videojuego " + e.getMessage());
        }
    }
    
    
/**
     * Insercion de videojuego en la BBDD
     * 
     * @param p     videojuego que se dará de alta
     */
    public static void insertaVideojuego(Videojuego v) {
        String sql = "insert into productos (codigo,titulo, estadoProducto,edadRecomendada,descripcion, precioCompra, id_tarifa, id_ubicacion, id_proveedor, id_franquicia,genero,numJugadores, plataforma,tipoProducto ) values (" + v.getCodigo() + ", '" + v.getTitulo();
        sql += "', '" + v.getEstado().toString() + "', " + v.getEdadRecomendada() + ",' " + v.getDescripcion();
        sql += "', " + v.getPrecioCompraProducto() + ", " + v.getTarifa().getId() + ", " + v.getUbicacion().getId() + ", " + v.getProveedor().getIdProveedor() + ", " + v.getFranquicia().getId() +",'"+ v.getGenero().toString()+"',"+v.getNumJugadores()+",'"+v.getPlataforma()+ "','" + v.getTipo().toString()+"')";

        Connection con = null;
        try {
            con = AccesoDatos.getConexion();
            Statement st = con.createStatement();
            st.executeUpdate(sql);
            AccesoDatos.cerrarConexion(con);
        } catch (Exception e) {
            System.out.println("Error al insertar Videojuego " + e.getMessage());
        }
    }

    /**
     * 
     * como en la modificacion del videojuego puede haber cambiado su codigo inicil por uno nuevo,
     * le pasamos el parametro 'codigo' para tener el codigo del videojuego inicial, para poder
     * buscarlo en la BBDD. El objeto Videojuego contendrá el codigo nuevo a modificar.
     * 
     * @param p         Videojuego a sobreescribir
     * @param codigo    codigo que utilizaremos para buscar el videojuego en la BBDD
     */
    public static void sobreescribeVideojuego(Videojuego p, int codigo){
        String sql = "UPDATE productos,tarifas, proveedores, ubicaciones,franquicia set productos.titulo= '"+p.getTitulo()+"' ,productos.codigo="+p.getCodigo();
        sql += ",productos.estadoProducto= '" + p.getEstado().toString() + "' ,productos.edadRecomendada = " + p.getEdadRecomendada() + " ,productos.descripcion= '" + p.getDescripcion()+"' ,productos.precioCompra=";
        sql += p.getPrecioCompraProducto() + ",productos.id_tarifa=" + p.getTarifa().getId() + ",productos.id_ubicacion=" + p.getUbicacion().getId() + ",productos.id_proveedor=" + p.getProveedor().getIdProveedor();
        sql += ",productos.plataforma='" + p.getPlataforma() + "' ,productos.numJugadores=" + p.getNumJugadores() + ",productos.duracion="+ "0" +",productos.director= '"+null +"' ,productos.reparto= '" + null +"'";
        sql += ",productos.anyo=" + "0" + ",productos.nacionalidad= '" + null + "' ,productos.genero= '" + p.getGenero().toString() + "' ,productos.tipoProducto= '" + p.getTipo().toString()+"' where productos.codigo=" + codigo;
        Connection con = null;
        try {
            con = AccesoDatos.getConexion();
            Statement st = con.createStatement();
            st.executeUpdate(sql);
            AccesoDatos.cerrarConexion(con);
        } catch (Exception e) {
            System.out.println("Error al modificar Videojuego " + e.getMessage());
        }
    }

    /**
     * Buscar el/los Videojuego/s que contega/n el nombre pasado por parametro
     * 
     * @param nombre        Nombre del videojuego a buscar en la BBDD.
     * 
     */
  public static List<Videojuego> consultaVideojuegosNombre(String nombre) throws NullPointerException{
        List<Videojuego> lista = new ArrayList();
        String sql = "select * from productos,ubicaciones, franquicia, tarifas, proveedores where productos.titulo like  '%"+nombre+"%' AND productos.id_ubicacion = ubicaciones.Id AND productos.id_tarifa = tarifas.Id AND productos.id_franquicia = franquicia.Id AND productos.id_proveedor = proveedores.Id AND (productos.tipoProducto='" + TipoProductoEnum.Videojuego+"')";
        Connection con = null;
        try {
            con = AccesoDatos.getConexion();
            Statement st = con.createStatement();
            ResultSet rs = st.executeQuery(sql);
            while (rs.next()) {
                Videojuego video = new Videojuego();
                video = obtenerVideojuegoPorId(rs.getInt("productos.codigo"));
                lista.add(video);
            }

        } catch (Exception e) {
            System.out.println("Error a obtener videojuego " + e.getMessage());
        }
        AccesoDatos.cerrarConexion(con);
        return lista;
    }

  /**
   * devuelve una lista de videojuegos filtrados por el Genero
   * 
   * @param genero      Genero del videojuego a buscar
   * 
   */
    public static List<Videojuego> consultaVideojuegosGenero(GeneroVideojuegoEnum genero)throws NullPointerException {
        List<Videojuego> lista = new ArrayList();
        String sql = "select * from productos,ubicaciones, franquicia, tarifas, proveedores where productos.genero='"+genero+"' AND productos.id_ubicacion = ubicaciones.Id AND productos.id_tarifa = tarifas.Id AND productos.id_franquicia = franquicia.Id AND productos.id_proveedor = proveedores.Id AND (productos.tipoProducto='" + TipoProductoEnum.Videojuego+"')";
        Connection con = null;
        try {
            con = AccesoDatos.getConexion();
            Statement st = con.createStatement();
            ResultSet rs = st.executeQuery(sql);
            while (rs.next()) {
                Videojuego video = new Videojuego();
                video = obtenerVideojuegoPorId(rs.getInt("productos.codigo")); 
                //a�adimos pelicula a la lista*/
                lista.add(video);
            }

        } catch (Exception e) {
            System.out.println("Error a obtener videojuego " + e.getMessage());
        }
        AccesoDatos.cerrarConexion(con);
        return lista;
    }
        
    
    /**
   * devuelve una lista de videojuegos filtrados por el Año
   * 
   * @param anno      Año de la pelicula a buscar
   * 
   */
    public static List<Videojuego> consultaVideojuegosAnno(int anno) throws NullPointerException{
        List<Videojuego> lista = new ArrayList();
        String sql = "select * from productos,ubicaciones, franquicia, tarifas, proveedores where productos.anyo="+anno+" AND productos.id_ubicacion = ubicaciones.Id AND productos.id_tarifa = tarifas.Id AND productos.id_franquicia = franquicia.Id AND productos.id_proveedor = proveedores.Id AND (productos.tipoProducto='" + TipoProductoEnum.Videojuego+"')";
        Connection con = null;
        try {
            con = AccesoDatos.getConexion();
            Statement st = con.createStatement();
            ResultSet rs = st.executeQuery(sql);
            while (rs.next()) {
                Videojuego video = new Videojuego();
                video = obtenerVideojuegoPorId(rs.getInt("productos.codigo")); 
                //a�adimos videojuego a la lista
                lista.add(video);
            }

        } catch (Exception e) {
            System.out.println("Error a obtener videojuego " + e.getMessage());
        }
        AccesoDatos.cerrarConexion(con);
        return lista;
    }

     
     /**
      * Devuelve un listado de videojuegis segun el Estado del Producto(Disponible, Dañado, Reservado,...)
      * 
      * @param estadoP      estado del producto
      * @return 
      */
     public static ArrayList<Videojuego> consultaVideojuegosEstadoProducto(ProductoEnum estadoP) throws NullPointerException{
        String sql = "select * from productos,ubicaciones, franquicia, tarifas, proveedores where productos.estadoProducto='"+estadoP+"' AND productos.id_ubicacion = ubicaciones.Id AND productos.id_tarifa = tarifas.Id AND productos.id_franquicia = franquicia.Id AND productos.id_proveedor = proveedores.Id AND(productos.tipoProducto='" + TipoProductoEnum.Videojuego+"')";
        Connection con = null;
        ArrayList<Videojuego> listaVideojuego = new ArrayList<Videojuego>();
        try {
            con = AccesoDatos.getConexion();
            Statement st = con.createStatement();
            ResultSet rs = st.executeQuery(sql);
            while (rs.next()) {
                Videojuego video = new Videojuego();
                video = obtenerVideojuegoPorId(rs.getInt("productos.codigo")); 
                //a�adimos videojuego a la lista
                listaVideojuego.add(video);
            }

        } catch (Exception e) {
            System.out.println("Error a obtener videojuego " + e.getMessage());
        }
        AccesoDatos.cerrarConexion(con);
        return listaVideojuego;
    }

     
    public static List<Videojuego> consultaVideojuegosProveedor(int idProve)throws NullPointerException{
        List<Videojuego> lista = new ArrayList();
        String sql = "select * from productos,ubicaciones, franquicia, tarifas, proveedores where productos.id_proveedor="+idProve+" AND productos.id_ubicacion = ubicaciones.Id AND productos.id_tarifa = tarifas.Id AND productos.id_franquicia = franquicia.Id AND productos.id_proveedor = proveedores.Id AND productos.tipoProducto='" + TipoProductoEnum.Videojuego+"'";   
        Connection con = null;
        try {
            con = AccesoDatos.getConexion();
            Statement st = con.createStatement();
            ResultSet rs = st.executeQuery(sql);
            while (rs.next()) {
                Videojuego video = new Videojuego();
                video = obtenerVideojuegoPorId(rs.getInt("productos.codigo"));
                //a�adimos pelicula a la lista
                lista.add(video);
            }

        } catch (Exception e) {
            System.out.println("Error a obtener el videojuego ");
        }
        AccesoDatos.cerrarConexion(con);
        return lista;
    }
        
    public static List<Videojuego> consultaVideojuegosFranquicia(int idFran)throws NullPointerException{
        List<Videojuego> lista = new ArrayList();
        String sql = "select * from productos,ubicaciones, franquicia, tarifas, proveedores where productos.id_franquicia="+idFran+" AND productos.id_ubicacion = ubicaciones.Id AND productos.id_tarifa = tarifas.Id AND productos.id_franquicia = franquicia.Id AND productos.id_proveedor = proveedores.Id AND productos.tipoProducto='" + TipoProductoEnum.Videojuego+"'";   
        Connection con = null;
        try {
            con = AccesoDatos.getConexion();
            Statement st = con.createStatement();
            ResultSet rs = st.executeQuery(sql);
            while (rs.next()) {
                Videojuego video = new Videojuego();
                video = obtenerVideojuegoPorId(rs.getInt("productos.codigo"));
                //a�adimos pelicula a la lista
                lista.add(video);
            }
        } catch (Exception e) {
            System.out.println("Error a obtener el videojuego ");
        }
        AccesoDatos.cerrarConexion(con);
        return lista;
    }
        
}

